//
//  BDJNavigationViewController.m
//  BuDeJie
//
//  Created by Guo Rui on 2017/9/19.
//  Copyright © 2017年 GR Harry. All rights reserved.
//

#import "BDJNavigationViewController.h"

@interface BDJNavigationViewController ()<UIGestureRecognizerDelegate>

@end

@implementation BDJNavigationViewController

+ (void)load
{
    UINavigationBar *appearance = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[self]];
    [appearance setTitleTextAttributes:@{ NSFontAttributeName : [UIFont boldSystemFontOfSize:20] }];
    [appearance setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
//    NSLog(@"%@", self.interactivePopGestureRecognizer);
    /*
        由于重新定制了navigationBar的返回按钮，所以边缘滑动返回失效。研究失效的原因：
     1. 首先找到navigationViewController的这个滑动返回手势，通过api找到属性interactivePopGestureRecognizer。
     2. 研究这个手势,通过打印如下。
     <UIScreenEdgePanGestureRecognizer: 0x7fcfa6b08b70; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fcfa691f2e0>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fcfa6b08a30>)>>、
     2.1 判断可能是这个手势在重新定制返回按钮后被置空了。但是，通过打印发现并没有。
     2.2 可能是手势代理进行了设置。先看该手势代理是否存在，通过打印确实存在。将delege置空, 置空后可以滑动返回了。
     
     滑动手势的问题解决了。 但是，有个bug，就是在栈顶控制器滑动时，界面就会假死。
     1. 设想解决方案，在栈顶控制器中不使用该手势。-> 于是设置手势的代理为self
     */
//    self.interactivePopGestureRecognizer.delegate = self;
    
    /*
        目标：做全屏滑动返回。
        1. 研究这个手势。在UIScreenEdgePanGestureRecognizer中找到edge这个属性，通过设置该属性发现并没有用。
        2. 只能重新创建一个拖拽手势. 但是，手势的实现过程并不知道，可以是interactivePopGestureRecognizer这个对象可以做到滑动返回，那么如果可以获取它的target和action就可以了。但是UIGestureRecognizer并没有提供target和action的方法。但是，通过打印知道了action是handleNavigationTransition:,target是_UINavigationInteractiveTransition这个类，目前可以确定_UINavigationInteractiveTransition有handleNavigationTransition:. 但并不能获取到实例对象。 通过刚才的打印知道interactivePopGestureRecognizer.delegate就是_UINavigationInteractiveTransition类型。那么可以使用这个对象试试。
     */
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
    pan.delegate = self;
    [self.view addGestureRecognizer:pan];
    
    self.interactivePopGestureRecognizer.enabled = NO;
}

/**
 *  该方法在用户手触摸屏幕时，并且在touchesBegan:withEvent:之前调用。
 *  作用：返回YES该手势可以触发。NO不触发。
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return self.childViewControllers.count > 1;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count > 0) {
        
        viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem backItemWithImage:[UIImage imageNamed:@"navigationButtonReturn"] highlightImage:[UIImage imageNamed:@"navigationButtonReturnClick"] target:self action:@selector(back) title:@"返回"];
    }
    
    [super pushViewController:viewController animated:animated];
}

- (void)back
{
    [self popViewControllerAnimated:YES];
}

@end
